package Servlet;

import Service.CaptchaStoreService;
import Service.UserService;
import entity.User;
import exception.AuthException;
import org.json.JSONException;
import org.json.JSONObject;
import utils.DBUtil;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;

/**
 * @Author Su
 * @Date 2025/4/30 16:16
 * @Version 1.0 （版本号）
 */
@WebServlet("/api/auth/login")
public class LoginServlet extends HttpServlet {
    private UserService userService; // 声明一个用户服务对象，用于处理用户登录业务逻辑

    @Override
    public void init() throws ServletException {// Servlet初始化方法，在Servlet创建时自动调用一次
        try {
            Connection connection = DBUtil.getConnection();
            this.userService = new UserService(connection);
        } catch (SQLException e) {
            throw new ServletException("初始化数据库连接失败", e);
        }
    }

    //处理POST请求的方法(doPost)
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        // 设置请求和响应的字符编码为UTF-8，防止中文乱码
        req.setCharacterEncoding("UTF-8");// 设置请求的字符编码
        resp.setContentType("application/json");// 设置响应内容类型为JSON格式
        resp.setCharacterEncoding("UTF-8");// 设置响应的字符编码

        JSONObject responseJson = new JSONObject();// 创建一个JSON对象，用于构建响应数据

        try {
            // 1. 解析请求体 获取前端发送的JSON数
            BufferedReader reader = req.getReader();// 获取请求的输入流
            StringBuilder sb = new StringBuilder();// 用于拼接请求体内容
            String line;
            while ((line = reader.readLine()) != null) {// 逐行读取请求体
                sb.append(line);// 将每行内容拼接到StringBuilder中
            }

            // 将请求体内容转换为JSON对象
            JSONObject requestJson = new JSONObject(sb.toString());
            // 从JSON中获取用户名、密码和图片验证码
            String username = requestJson.getString("username");
            String password = requestJson.getString("password");
            String captcha = requestJson.getString("captcha");

            // 2. 验证验证码
            HttpSession session = req.getSession(false);// 获取现有Session//可能会null
            System.out.println("session" + session );// 调试日志

            // ***验证码校验逻辑         当 session ==null为true，validateCaptcha 不会执行
            if (session == null || !CaptchaStoreService.validateCaptcha(session.getId(), captcha)) {
                responseJson.put("code", 400);
                responseJson.put("message", "验证码错误或已过期");
                resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
                return;
            }

            // 3. 验证登录
            User user = userService.login(username, password);// 调用服务层认证

            // 4. 创建会话
            session = req.getSession();//创建新session
            session.setAttribute("user", user);//存储user对象到session
                          //不活跃的时间间隔
            session.setMaxInactiveInterval(30 * 60); // 30分钟超时
                    //todo：登录页面只能停留30min，30mins无login后要重新打开页面，手动搜url访问，得重新打开页面，可以再优化

            // 5. 返回成功响应
            responseJson.put("code", 200);
            responseJson.put("message", "登录成功");
            // 嵌套用户信息的JSON对象
            responseJson.put("data", new JSONObject()
                    .put("userId", user.getUserId())
                    .put("username", user.getUsername())
                    .put("email", user.getEmail())
            );

            resp.setStatus(HttpServletResponse.SC_OK);//200状态码



        } catch (JSONException e) {
            //json解析异常处理
            responseJson.put("code", 400);
            responseJson.put("message", "请求参数错误");
            resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        } catch (AuthException e) {
            // 认证失败异常处理 封装了
            responseJson.put("code", 401);
            responseJson.put("message", e.getMessage());
            resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        } catch (Exception e) {
            responseJson.put("code", 500);
            responseJson.put("message", "系统错误");
            resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            e.printStackTrace();// 打印错误堆栈
        } finally {
            // 最终确保响应被发送
            try (PrintWriter out = resp.getWriter()) {
                out.print(responseJson.toString());//输出json响应
            }
        }
    }
}